#include <iostream>
#include <vector>
#define INF 6000 // INF已经被定义为一个比图中所有权值都要大的值
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<vector<int>> g(n + 1, vector<int>(n + 1, INF));

    int i, j, k, minw, sum;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
            cin >> g[i][j];
    }
    int v0 = 1;                  // 起始顶点
    vector<int> lowcost = g[v0]; // 当前生成树到图中其余顶点的边的最小权值
    vector<int> vset(n + 1, 0);  // 标记数组，置1表示已经并入生成树
    vset[v0] = 1;                // 将v0并入树中
    sum = 0;                     // sum清零，用来累计树的权值
    for (i = 0; i < n - 1; ++i)
    {
        minw = INF;
        // 下面的循环找出候选边中的最小值
        for (j = 1; j <= n; ++j)
        {
            if (vset[j] == 0 && lowcost[j] < minw)
            {
                minw = lowcost[j];
                k = j;
            }
        }
        vset[k] = 1;
        sum += minw; // 累计树的权值
        // 以刚并入的顶点为媒介更新最小生成树的权值
        for (j = 1; j <= n; ++j)
        {
            if (vset[j] == 0 && g[k][j] < lowcost[j])
                lowcost[j] = g[k][j];
        }
    }
    cout << sum << endl;
    return 0;
}